package main;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import structure.Rodove;
import db.DbHelper;

/*Class provide accessing to all methods we need*/
class Worker {

    private DbHelper db_helper;

    // get current datetime
    private Calendar cal = Calendar.getInstance();
    private int cur_year = cal.get(Calendar.YEAR);
    private int cur_month = cal.get(Calendar.MONTH);
    private int cur_day = cal.get(Calendar.DAY_OF_WEEK);

    // create instanse of DB
    public Worker() {
	this.db_helper = new DbHelper();
    }

    private void showInfo() {
	String task = "Задача 3. Видобути інформацію, де відібрати дані для виведення інформації.";
	ArrayList<Rodove> arr = this.db_helper.select();

	writeData(task, arr, System.out);
    }

    private void showRozpodil() {
	String task = "Задача 4. Вивести інформацію про розподіл кількості родовищ в областях за типом родовища. Навпроти назв регіонів і областей, розділених комами, установити значення кількості для кожного типу родовища. Передбачити підсумки по вертикалі і по горизонталі. До заголовка звіту додати слова “станом на ” і встановити поточну дату.";
	ArrayList<Rodove> arr = this.db_helper.select();

	task += "\nСтаном на :" + cur_day + "." + cur_month + "." + cur_year;
	System.out.println(task);

	Set<String> oblast = new HashSet<String>();

	// get 'oblast' names
	for (Rodove rodove_item : arr) {
	    oblast.add(rodove_item.getOblast());
	}

	// go through all 'oblasts'
	for (String oblast_name : oblast) {
	    // select diff items and count them
	    Map<String, Integer> type_arr = new HashMap<String, Integer>();
	    type_arr.clear();

	    type_arr.put("Нафтове", 0);
	    type_arr.put("Газове", 0);
	    type_arr.put("Нафтогазове", 0);
	    type_arr.put("Нафтогазоконденсатне", 0);
	    type_arr.put("Газоконденсатне", 0);

	    Set<String> region = new HashSet<String>();
	    for (Rodove item : arr) {
		// check if current 'oblast'
		if (oblast_name.equals(item.getOblast())) {
		    String key = item.getType();
		    int value = type_arr.get(key);
		    ++value;
		    type_arr.put(key, value);
		    
		    //set region
		    region.add(item.getRegion());
		}
	    }

	    System.out.println("\nОбласть: " + oblast_name+", регіони:");
	    for (String region_name : region) {
		System.out.print(region_name);
	    }
	    System.out.println();
	    for (String type_name : type_arr.keySet()) {
		System.out.println(type_name + " = " + type_arr.get(type_name));
	    }

	}

    }

    // add last 30 years, 'cause last 8 year there is no info
    private void showLastYearsRodove() {
	String task = "Задача 5. Обчислити залежність, відобразити динаміку відкриття нових родовищ (кількість) по Україні протягом останніх восьми років.\n"
		+ "Задача 8. Виготовити консольний екранний блок зі всіма відомостями про родовища, передбачити видачу відповідних повідомлень для старих родовищ, відкритих 10 і більше років тому. Вказати назви регіонів і областей.";
	ArrayList<Rodove> arr = this.db_helper.selectYearAfter(30);

	writeData(task, arr, System.out);
    }

    private void showYearDiff() {
	String task = "Задача 6. Вивести інформацію з відомостями про родовища, куди внести назви регіонів, назви родовищ та різницю в роках між моментом відкриття і введення в розробку. Відібрати лише нафтогазові родовища. До заголовка виведення інформацію додати слова “станом на ” і встановити поточну дату. Підсумувати різницю в роках для регіонів і для всього звіту."
		+ "Задача 9. Скласти програму для видачі інформації за умовою задачі 6. , яка запускає видачу інформації з консольного інтерфейсу, забезпечити видачу інформації: виготовленого майстром і програмою.";

	task += "\nСтаном на :" + cur_day + "." + cur_month + "." + cur_year;

	ArrayList<Rodove> arr = this.db_helper.select();
	ArrayList<Rodove> new_arr = new ArrayList<Rodove>();

	int year_sum_reg = 0;
	int year_sum_all = 0;
	for (Rodove item : arr) {
	    int year_diff = item.getYear_used() - item.getYear_start();

	    year_sum_all += year_diff;
	    if (item.getType().equals("Нафтогазове")) {
		year_sum_reg += year_diff;

		item.setYear_used(year_diff);
		new_arr.add(item);
	    }

	}

	task += "\nСума різниці в роках для регіонів: " + year_sum_reg;
	task += "\nСума різниці в роках для всього звіту: " + year_sum_all;
	writeData(task, new_arr, System.out);

    }

    // change default System.out writer to file outter
    private void showToFile() {
	String task = "Задача 7. Виготовити консольний інтерфейс для перегляду вмісту всіх структур з даними та доповнення початкового файлу відомостями про нові родовища. Забезпечити запуск виведення інформації та внесення в файл.";

	FileOutputStream out; // declare a file output object
	PrintStream p; // declare a print stream object

	try {
	    out = new FileOutputStream("data.csv");

	    // use printstream
	    p = new PrintStream(out);

	    ArrayList<Rodove> arr = this.db_helper.select();
	    writeData(task, arr, p);

	    p.close();
	} catch (IOException e) {
	    e.printStackTrace();
	}
    }

    /** complete do all tasks */
    public void run() {
	// set first row name
	showInfo();
	showLastYearsRodove();
	showYearDiff();
	showToFile();
	showRozpodil();
    }

    // print data to CSV format
    private void writeData(String task, ArrayList<Rodove> arr,
	    PrintStream outter) {
	outter.println(task);

	for (Rodove item : arr) {
	    outter.println(item.getName() + ";" + item.getOblast() + "; "
		    + item.getRegion() + ";" + item.getPlace() + "; "
		    + item.getType() + ";" + item.getGas_size() + "; "
		    + item.getOil_size() + "; " + item.getYear_start() + "; "
		    + item.getYear_used() + "; " + item.getSkhema());
	}

	outter.println("###################################################");
    }

}
